"""
当出现两个相同的函数名时新的会覆盖旧的函数

python没有函数重载，但可以通过设置形参的默认值来模拟部分重载效果

"""


# 定义自定义函数,无参类型
# demo()
def demo():
    print("我是自定义函数")


def demo2(name, age=18):
    """
    默认参数：这些参数在函数定义时就已经指定了默认值。如果调用函数时未提供对应参数的值，则会使用默认值。
    如：
    demo2("小明")
    """
    print(f"你好，我的名字叫{name}，今年{age}了")


# 返回值
# demo3()
def demo3():
    # 函数类的变量叫局部变量,只作用于函数内,如果需要返回则需要再函数的最后面添加return
    # 例外,函数里没写return时,默认返回的是None,即空的值
    a = 114514
    return a


# 可变数量的参数
def demo4(*args):
    """
    可变位置参数：允许函数接受可变数量的位置参数，使用 * 操作符。

    *args tuple 类型是元组
    只能最后一个，并且该参数以及后面的参数都会为一个元组
    如：
    demo4(1, 2, 4, 5)
    """
    print(args)


# 可变数量的参数
def demo5(**kwargs):
    """
    可变关键字参数：允许函数接受可变数量的关键字参数，使用 ** 操作符。

    **kwargs 类型是dict 字典
    参数只能是键值对
    只能最后一个，并且该参数以及后面的键值对参数都会为一个字典

    如：
    demo5(name="小明明", age="18", demo="2136")
    """
    print(kwargs)


def demo06(title, age):
    """
    关键词参数，在函数调用时指定参数名来传递实参，可以不按顺序传递参数。如
    demo06(age=15, title="你好")

    实际函数形参值
    title="你好"
    age=15

    """
    print(title, age)


def demo07(title, age):
    """
    位置参数：按照定义时的顺序依次传递给函数的参数。函数调用时实参的位置与形参的位置要一一对应。
    """
    print(title, age)


def demo08():
    """
    多个返回值
    用元组包裹，也就是返回值为元组，返回的多个值，是元组中的元素
    """
    return 14, 567


# 使用 lambda 创建匿名函数
add = lambda a, b: a + b

result = add(2, 3)  # 输出: 5

